import axios, { type Method } from 'axios'
import { showToast } from 'vant'
import router from '@/router'
import { useUserStore } from '@/stores'

const baseURL = 'https://consult-api.itheima.net/'
const instance = axios.create({
  baseURL,
  timeout: 10000
})

instance.interceptors.request.use(
  (config) => {
    const store = useUserStore()//细节 注意加载顺序
    if (store.user?.token && config.headers) {
      // config.headers 或者 非空断言 ！ 是为了防止 headers 为空
      config.headers['Authorization'] = `Bearer ${store.user?.token}`
    }
    return config
  },
  (err) => Promise.reject(err)
)

instance.interceptors.response.use(
  (res) => {
    // status 200响应成功，res.data.code10000业务成功 否则 轻提示错误 阻断程序
    if (res.data.code !== 10000) {
      showToast(res.data.message || '网络异常')
      return Promise.reject(res.data)
    }
    // 成功  玻璃无效数据
    return res.data
  },
  (err) => {
    // 请求报错，相应出错  处理401
    // vue2中 $router是路由实例 提供路由相关函数操作， $route 路由相关信息 query params path...
    if (err.response.status === 401) {
      const store = useUserStore() //细节 注意加载顺序
      store.delUser()
      router.push(`login?returnUrl=${router.currentRoute.value.fullPath}`)
    }
    return Promise.reject(err)
  }
)
// 工具函数封装
type Data<T> = {
  code: number
  message: string
  data: T
}
const request = <T>(url: string, method: Method = 'get', submitData?: object) => {
  // 泛型的第二个参数  可以自定义响应式数据类型
  return instance.request<T, Data<T>>({
    url,
    method,
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}

export { baseURL, instance, request }
